package com.yuedou.api.util;

import lombok.Data;

/**
 * @创建者：zhouwei
 * @创建时间：2022/9/29
 * @描述：
 */
@Data
public class GetDistance {

    /**

     * 默认地球半径
     */
    private static double EARTH_RADIUS = 6378137;//赤道半径(单位m)  6371000  6378.137
    // 经度
    private double lng;
    // 维度
    private double lat;

    public GetDistance() {
    }

    public GetDistance(double lng, double lat) {
        this.lng = lng;
        this.lat = lat;
    }

    public static void main(String[] args){
        GetDistance start=new GetDistance(116.510958,39.90786);
        GetDistance end=new GetDistance(116.510842,39.90777);
        GetDistance end1=new GetDistance(123.434932,41.773151);
        GetDistance end2=new GetDistance(123.434675,41.804125);
        GetDistance end3=new GetDistance(123.474758,41.789792);

        System.out.println("两点间距离："+getDistance(start,end)+"米");
//        System.out.println("两点间距离："+getDistance(start,end1)+"米");
//        System.out.println("两点间距离："+getDistance(start,end2)+"米");
//        System.out.println("两点间距离："+getDistance(start,end3)+"米");


        double lon = 116.510958; //当前经度
        double lat = 39.90786; //当前纬度

        double lon1=116.510842;
        double lat1=39.90777;

        // double lon2=108.9644583556;
        // double lat2=34.286439088548;

        double dist;
        double dist2;
        dist = GetDistance(lon, lat, lon1, lat1);
        dist2 = distance(lon, lat, lon1, lat1);
        System.out.println("1.两点相距：" + dist + " 米");
        System.out.println("2.两点相距：" + dist2 + " 米");
    }

    /**
     * 计算两个经纬度之间距离
     * @param start 当前用户 坐标
     * @param end   要比对的 目标坐标
     * @return 单位 米
     */
    public static int getDistance(GetDistance start,GetDistance end) {
        double lon1 = (Math.PI / 180) * start.getLng();
        double lat1 = (Math.PI / 180) * start.getLat();
        double lon2 = (Math.PI / 180) * end.getLng();
        double lat2 = (Math.PI / 180) * end.getLat();
        // 地球半径
        double R = 6371;
        // 两点间距离 km，如果想要米的话，结果*1000就可以了
        double d = Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1)) * R;
        return (int)Math.ceil(d * 1000);  //结果取整
    }


    /**
     * 计算中心经纬度与目标经纬度的距离(米)
     * @param centerLon 中心精度
     * @param centerLat 中心纬度
     * @param targetLon 需要计算的精度
     * @param targetLat 需要计算的纬度
     * @return 米
     */
    public static double distance(double centerLon, double centerLat, double targetLon, double targetLat) {
        double jl_jd = 102834.74258026089786013677476285;// 每经度单位米;
        double jl_wd = 111712.69150641055729984301412873;// 每纬度单位米;
        double b = Math.abs((centerLat - targetLat) * jl_jd);
        double a = Math.abs((centerLon - targetLon) * jl_wd);
        return Math.sqrt((a * a + b * b));
    }

    /**
     * 转化为弧度(rad)
     * */
    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /*
    * @param lon1 第一点的精度
    * @param lat1 第一点的纬度
    * @param lon2 第二点的精度
    * @param lat2 第二点的纬度
    * @return 返回的距离，单位m
    * */
    public static double GetDistance(double lon1,double lat1,double lon2, double lat2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lon1) - rad(lon2);
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        s = Math.round(s * 10000) / 10000;
        return s;
    }
}
